package controllers;

import interfaces.IDepartamento;
import interfaces.IMaquina;
import interfaces.ITipo;
import interfaces.IUsuario;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.NoResultException;
import javax.servlet.http.HttpSession;

import beans.Departamento;
import beans.Maquina;
import beans.Tipo;
import beans.Usuario;


@ManagedBean(name="UsuarioController")
@SessionScoped
public class UsuarioController implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Usuario usuario = new Usuario();
	private Usuario usuarioLogado = new Usuario();
	@EJB
	private IUsuario usuarioEJB;
	private HtmlSelectOneMenu departamentoSelecionado;
	private HtmlSelectOneMenu tipoSelecionado;
	private HtmlSelectOneMenu maquinaSelecionado;
	@EJB
	private IMaquina maquinaEJB;
	@EJB
	private ITipo tipoEJB;
	@EJB
	private IDepartamento dapartamentoEJB;
	private List<Usuario> usuarios = new ArrayList<Usuario>();
	
	
	
	public void cadastrarUsuario() throws InstantiationException, IllegalAccessException{
		
		Integer id = Integer.parseInt(maquinaSelecionado.getValue().toString());
		Maquina m = getMaquinaEJB().select(id);
		System.out.println("ID Maquina Selecionada "+id);
		usuario.setMaquina(m);
		
		Integer id2 = Integer.parseInt(departamentoSelecionado.getValue().toString());
		Departamento d = getDapartamentoEJB().select(id2);
		System.out.println("id Departamento selecionado "+ id2);
		usuario.setDepartamento(d);
		
		Integer id3 = Integer.parseInt(tipoSelecionado.getValue().toString());
		Tipo t2 = getTipoEJB().select(id3);
		System.out.println("id TIpo selecionado "+ t2.getDescricao());
		usuario.setTipo(t2);
		
		
		if (usuario.getIdusuario()!= null){
			
			System.out.println("alterando...");
			usuarioEJB.update(usuario);
			System.out.println("usuario alterado "+usuario.getNome());
			usuario =  new Usuario();
			maquinaSelecionado.setValue(null);
			tipoSelecionado.setValue(null);
			departamentoSelecionado.setValue(null);
			
		}else{
			try {
				Usuario u = usuarioEJB.usuarioByLogin(usuario.getLogin());
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro de Login", "Esse Login ja existe, escolha outro"));
				
//				throw new Exception();
			} catch (Exception e) {
				usuarioEJB.insert(usuario);
				System.out.println("inserindo....");
				System.out.println("usuario inserido "+usuario.getNome());
				usuario =  new Usuario();
				maquinaSelecionado.setValue(null);
				tipoSelecionado.setValue(null);
				departamentoSelecionado.setValue(null);
			}
		}
	
		
		//retorno pagina de acesso
		//return "sucessoUsuario";
	}

	public Usuario editar(){
		
		System.out.println("alterando...");
		
		return usuario;
		
	};
	public void cancelar(){
		usuario = new Usuario();
		maquinaSelecionado.setValue(null);
		tipoSelecionado.setValue(null);
		departamentoSelecionado.setValue(null);
		//return "Cancelado";
	}

	public void deletar(){
		try{
		System.out.println("id a ser deletado: " + usuario.getIdusuario());
		usuarioEJB.delete(usuario.getIdusuario());
		
	} catch (Exception e) {
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro ao excluir", "Esse Usuario não pode ser excluído"));
		
	}
		usuario = new Usuario();
	}
	
	public String logout(){
		FacesContext ctx = FacesContext.getCurrentInstance();
		ctx.getExternalContext().getSessionMap().remove("UsuarioController");
		//this.usuarioLogado = new Usuario();
		HttpSession sessao = (HttpSession) ctx.getExternalContext().getSession(false);
	    sessao.invalidate();
		return "index?faces-redirect=true"; 
	}
	
	//getters and setters
	
	public IMaquina getMaquinaEJB() {
		return maquinaEJB;
	}

	public IDepartamento getDapartamentoEJB() {
		return dapartamentoEJB;
	}

	public void setDapartamentoEJB(IDepartamento dapartamentoEJB) {
		this.dapartamentoEJB = dapartamentoEJB;
	}

	public void setMaquinaEJB(IMaquina maquinaEJB) {
		this.maquinaEJB = maquinaEJB;
	}

	public IUsuario getUsuarioEJB() {
		return usuarioEJB;
	}

	public void setUsuarioEJB(IUsuario usuarioEJB) {
		this.usuarioEJB = usuarioEJB;
	}

	public ITipo getTipoEJB() {
		return tipoEJB;
	}

	public void setTipoEJB(ITipo tipoEJB) {
		this.tipoEJB = tipoEJB;
	}

	public String cadastroMaquina(){
		return "cadastroMaquina";
	}
	
	public String cadastroUsuario(){
		
		this.usuario = new Usuario();
		
		return "cadastroUsuario";
	}
	
	public String cadastroChamada(){
		return "cadastroChamada";
	}
	
	public HtmlSelectOneMenu getTipoSelecionado() {
		return tipoSelecionado;
	}

	public void setTipoSelecionado(HtmlSelectOneMenu tipoSelecionado) {
		this.tipoSelecionado = tipoSelecionado;
		
	}
		
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	//combo box das maquinas
	public List<SelectItem> getMaquinasParaComboBox() {
		List<SelectItem> listaM = new ArrayList<SelectItem>();
		for (Maquina m : this.getMaquinaEJB().SelectAll()) {
			listaM.add(new SelectItem(m.getIdmaquina(), m.getDescricao()));
		}
		return listaM;
	}

	public HtmlSelectOneMenu getMaquinaSelecionado() {
		return maquinaSelecionado;
	}

	public void setMaquinaSelecionado(HtmlSelectOneMenu tipoSelecionado) {
		this.maquinaSelecionado = tipoSelecionado;
	}
	
	public HtmlSelectOneMenu getDepartamentoSelecionado() {
		return departamentoSelecionado;
	}

	public void setDepartamentoSelecionado(HtmlSelectOneMenu usuarioSelecionado) {
		this.departamentoSelecionado = usuarioSelecionado;
	}

	// combobox de tipo
	public List<SelectItem> getTiposParaComboBox() {
		List<SelectItem> listaT = new ArrayList<SelectItem>();
		for (Tipo t : this.getTipoEJB().SelectAll()) {
			listaT.add(new SelectItem(t.getIdtipo(), t.getDescricao()));
		
		}
		return listaT;
	}

	// combo box para departamento
	public List<SelectItem> getDepartamentosParaComboBox() {
		List<SelectItem> listaD = new ArrayList<SelectItem>();
		for (Departamento d : this.getDapartamentoEJB().SelectAll()) {
			listaD.add(new SelectItem(d.getIddepartamento(), d.getDescricao()));
		}
		return listaD;
	}

	
	public String validaLogin() {
		String retorno = null;
		System.out.println(usuario.getLogin()+" - "+usuario.getSenha());
		try {
			//entradas padrões de acesso
			if (usuario.getLogin().equals(new String("admin"))
					&& usuario.getSenha().equals(new String("admin"))) {
				retorno = "Admin";
				
				
			} else if (this.usuario.getLogin().equals(new String("user"))
				&& this.usuario.getSenha().equals(new String("user"))) {
				retorno = "User";
			
				
			} else {
				//validaçao com dados do banco
				Usuario comparador = usuarioEJB.getLogin(usuario.getLogin(), usuario.getSenha());
				 FacesContext contexto = FacesContext.getCurrentInstance();
			     HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);
			     
				if ((comparador.getLogin().equals(new String (usuario.getLogin())) && comparador
						.getSenha().equals(new String(usuario.getSenha())))) {

					if (comparador.getTipo().getDescricao().equals(new String ("Admin"))) {
						this.setUsuarioLogado(comparador);
						this.setUsuario(new Usuario());
//						sessao.setAttribute("login", usuarioLogado.getLogin());
//					    sessao.setAttribute("senha", usuarioLogado.getSenha());
//					    sessao.setAttribute("tipo", usuarioLogado.getTipo().getDescricao());
						retorno = "Admin?faces-redirect=true";
//						retorno = "sucessoAdmin";
					} else {
						this.setUsuario(comparador);
//						sessao.setAttribute("login", usuario.getLogin());
//					    sessao.setAttribute("senha", usuario.getSenha());
//					    sessao.setAttribute("tipo", usuario.getTipo().getDescricao());
//						retorno = "sucessoUsuario";
						retorno = "User?faces-redirect=true";
					}
				} throw new Exception();
			}
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Login Inválido - usuario ou senha não existem","usuario ou senha não existem "));
			
		}
		return retorno;

	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public List<Usuario> getUsuarios() {
		usuarios = getUsuarioEJB().SelectAll();
		
		return usuarios;
	}
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}
	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

//	public String recuperaSenha() throws InstantiationException,
//			IllegalAccessException {
//		String retorno = null;
//		try {
//			Usuario comparador = dao.getSenha(this.getUsuario().getLogin(),
//					this.getUsuario().getCpf());
//			if (comparador.getLogin().equals(usuario.getLogin())
//					&& comparador.getCpf().equals(usuario.getCpf())) {
//				retorno = "recuperaSenha";
//			}
//		} catch (NoResultException e) {
//			retorno = "erro";
//		}
//		return retorno;
//	}
//
//	public String atualizaSenha() {
//		dao.update(usuario);
//		return "sucessoSenha";
//	}
//
//	public Usuario getUsuario() {
//		return this.usuario;
//	}
//
//	public Usuario getUsuarioBanco() {
//		Usuario comparador = dao.getLogin(this.getUsuario().getLogin(),
//				this.getUsuario().getSenha());
//		return comparador;
//	}


}
